package org.lanqiao.tjut.testpractice0801;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import org.junit.Test;

public class TestDriver01 {
	/**
	 * 【程序24】    
	 * 题目：给一个不多于5位的正整数，要求：一、求它是几位数，二、逆序打印出各位数字。    
	 * 使用了长整型最多输入18位
	 */
	@Test
	public void test01(){
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数！");
		int num = sc.nextInt();
		/*
		 * //强制转换成字符串，判断字符串的长度从而判定位数 
		 * String str = num + ""; 
		 * System.out.println("该数是个 "+str.length()+" 位数");
		 */
		//while循环判定是几位数
		//首先定义除数为10，然后依次递增10倍，用i去除num，直到商为零
		int i=10;
		//计数有几位数，如果num<10,默认为1位数
		int count = 1;
		while(i>0){
			int shang = num/i;
			i=10*i;
			if(shang==0){
				System.out.println("这个数是："+count+" 位数");
				break;
			}
			count++;
		}
		//
		int[] arr=new int[count];
		//倒序存储各个位的数
		for(int k=count-1;k>=0;k--){
			int s=(int) Math.pow(10, k);
			int n=num/s;
			num = num%s;
			arr[k]=n;
		}
		//顺序遍历打印数组，倒序打印出各位数
		for(int k=0;k<count;k++){
			System.out.print(arr[k]+" ");
		}
		//换行
		System.out.println();
	}

	/**
	 * 【程序25】    
	 * 题目：一个5位数，判断它是不是回文数。
	 * 即12321是回文数，个位与万位相同，十位与千位相同。
	 */
	@Test
	public void test02() {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数");
		int num = sc.nextInt();
		// 使用字符串判断
		String str = num + "";
		int low = 0;
		int high = str.length() - 1;
		while (true) {
			char a = equalTwo(str, low);
			char b = equalTwo(str, high);
			// 如果是偶数位数，则a==b且low等于str.length()/2时结束
			// 如果是奇数位数，则low和high是同一个数，不需要比较，直接结束
			if ((a == b && low <= high)) {
				low++;
				high--;
				if (low == high || high==str.length()/2) {
				System.out.println("此数是回文数！");
				break;
			} 
			}
			if(a != b) {
				System.out.println("此数不是回文数！");
				break;
			}

		}
	}

	/**
	 * 取出对应位置的数的子方法
	 */
	public char equalTwo(String str,int n){
		char m=str.charAt(n);
		return m;
		
	}

	
	/*
	 * 【程序26】    
	 * 题目：请输入星期几的第一个字母来判断一下是星期几， 
	 * 如果第一个字母一样，则继续判断第二个字母。
	 * Monday，Tuesday，Wednesday，Thursday，Friday，Saturday，Sunday
	 */
	@Test
	public void test03() {
		boolean isFlag = true;
		while (true) {
			Scanner sc = new Scanner(System.in);
			System.out.println("请输入第一个字母：");
			String lett = sc.next();
			// 有可能无法区分大小写
			// 如果首字母是M,则是星期一
			if (lett.equalsIgnoreCase("m")) {
				System.out.println("It's Monday!");
			}
			// 如果首字母是W，则表示是星期三
			if (lett.equalsIgnoreCase("w")) {
				System.out.println("It's Wednesday!");
			}
			// 如果首字母是F,则表示是星期五
			if (lett.equalsIgnoreCase("f")) {
				System.out.println("It's Friday!");
			}
			//首字母是t，需要判断第二个字母
			if(lett.equalsIgnoreCase("t")){
				System.out.println("请输入第二个字母：");
				String lett2 = sc.next();
				if(lett2.equalsIgnoreCase("u")){
					System.out.println("It's Tuesday！");
				}
				if(lett2.equalsIgnoreCase("h")){
					System.out.println("It's Thursday!");
				}
			}
			//如果首字母是S，需要判断第二个字母
			if(lett.equalsIgnoreCase("s")){
				System.out.println("请输入第二个字母：");
				String lett2 = sc.next();
				if(lett2.equalsIgnoreCase("a")){
					System.out.println("It's Saturday!");
				}
				if(lett2.equalsIgnoreCase("u")){
					System.out.println("It's Sunday!");
				}
			}
			//输入1继续循环，输入0取消循环
			System.out.println("请决定是否继续判断星期几？（1继续，0退出）");
			int n = sc.nextInt();
			if(n==1){
				isFlag = true;
			} 
			if(n==0){
				break;
			}
		}

	}
	
	/*
	 * 【程序28】    
	 * 题目：对10个数进行排序   
	 */
	@Test
	public void test04() {
		// 从控制台输入需要排序的数字个数
		System.out.println("请输入需要排序的数字个数：");
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		// 创建一个数组，用来存放需要排序的数,数组的长度刚好为n
		int[] arr = new int[n];
		// 使用for循环输入n个数字
		for (int i = 0; i < n; i++) {
			System.out.println("请输入第 " + i + " 个数字");
			int num = sc.nextInt();
			arr[i] = num;
		}
		//遍历打印数组
		System.out.println("排序前：");
		for (int i : arr) {
			System.out.print(" " + i);
		}
		System.out.println("\n排序后：");
		printArr(arr);
	}

	/**
	 * 排序子方法 采用快速排序
	 * 
	 * @param arr
	 *            排序的数组
	 */
	public void printArr(int[] arr) {
		for(int i=0;i<arr.length;i++){
			for (int j = 0; j < arr.length ; j++) {
			// 判断arr[i]和arr[i+1]大小
			// 如果[i]>[i+1]，则交换位置，否则默认不进行交换
			if (arr[i] < arr[j]) {
				int temp = arr[j];
				arr[j] = arr[i];
				arr[i] = temp;
			}
		}
		}
		
		//遍历打印数组
		for (int i : arr) {
			System.out.print(" " + i);
		}
	}
	
	/*
	 * 【程序29】    题目：求一个3*3矩阵对角线元素之和
	 */
	@Test
	public void test05() {
		// 由控制台输入创建二维数组
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入矩阵阶数：");
		int n = sc.nextInt();
		// 创建一个二维数组，存放数据
		int[][] arr = new int[3][3];
		// for循环输入数组元素
		// 行
		for (int i = 0; i < n; i++) {
			// 列
			for (int j = 0; j < n; j++) {
				System.out.println("请输入第 " + i + " 行" + j + " 列的元素：");
				arr[i][j] = sc.nextInt();
			}
		}

		// 遍历打印数组
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				System.out.print(" " + arr[i][j]);
			}
			// 换行
			System.out.println();
		}

		// 初始化总和为
		int sum = 0;
		// for循环求和
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				// 主对角线元素i==j
				if (i == j) {
					sum = sum + arr[i][j];
				}
			}
		}
		// 输出求和结果
		System.out.println(n + " 阶矩阵的对角线元素总和为：" + sum);
	}
	
	/*
	 * 【程序30】   
	 * 题目：有一个已经排好序的数组。现输入一个数，要求按原来的规律将它插入数组中。
	 */
	@Test
	public void test06() {
		// 从控制台输入数组元素，创建数组
		// 从控制台输入维数
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入数组维数（长度）：");
		int n = sc.nextInt();
		// 创建一个n维数组
		int[] arr = new int[n];
		// for循环输入数组元素
		for (int i = 0; i < n - 1; i++) {
			System.out.println("请输入第 " + i + " 个元素：");
			Scanner inp = new Scanner(System.in);
			arr[i] = inp.nextInt();
		}

		// 遍历打印创建的数组
		System.out.println("--该数组内容为--");

		for (int i : arr) {
			System.out.print(" " + i);
		}

		// 换行
		System.out.println();

		// 插入元素的数组必须是有序数组，所以先对创建的数组进行排序
		// 调用快速排序子方法
		System.out.println("排序后数组内容为:");
		printArr(arr);
		System.out.println();

		// 输入插入元素
		System.out.println("请输入要插入的元素：");
		int a = sc.nextInt();

		// 将元素插入数组
		// 方法一，插入排序后数组第一位，进行排序
		arr[0] = a;
		printArr(arr);
		System.out.println();
		// 打印出插入位置
		for (int i = 0; i < n; i++) {
			if (arr[i] == a) {
				System.out.println("元素 " + a + "插入的位置为：" + i);
				break;
			}
		}
	}
	
}